home *** CD-ROM | disk | FTP | other *** search
/ MPEG Toolkit / MPEG Toolkit.iso / linux / xvmpeg / xvmpeg-0.000 / xvmpeg-0 / xvmpeg-0.1 / xvmpeg.c < prev    next >
C/C++ Source or Header  |  1995-08-05  |  8KB  |  289 lines

  1. /*
  2.  * This is xvmpeg v0.1 (4-08-1995)
  3.  * Copyright (C) 1995 Alexandre Naaman <hoser@step.polymtl.ca>
  4.  */
  5.  
  6. /*   This program is free software; you can redistribute it and/or
  7.      modify it under the terms of the GNU General Public License
  8.      as published by the Free Software Foundation; either version 2
  9.      of the License, or (at your option) any later version.
  10.  
  11.      This program is distributed in the hope that it will be useful,
  12.      but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.      GNU General Public License for more details.
  15.  
  16.      You should have received a copy of the GNU General Public License
  17.      along with this program; if not, write to the Free Software
  18.      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  19.  
  20.  
  21. #include <xview/xview.h>
  22. #include <xview/panel.h>
  23. #include <xview/notice.h>
  24. #include <xview/file_chsr.h>
  25. #include <xview/icon.h>
  26. #include <xview/svrimage.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <sys/stat.h>
  30. #include <unistd.h>
  31.  
  32. #include "xvmpeg.xbm"
  33. #include "xvmpeg_mask.xbm"
  34.  
  35. #define XVMPEG_NAME "xvmpeg v0.1"
  36.  
  37. Frame frame;
  38. Panel panel;
  39. Panel_item options, dither, quiet;
  40. char f_name[PATH_MAX+NAME_MAX];
  41. int init_height, init_width;
  42.  
  43. void show_warning(void)
  44. {
  45.   Xv_notice notice;
  46.   
  47.   notice = (Xv_notice)xv_create(panel, NOTICE,
  48.       NOTICE_MESSAGE_STRINGS,
  49.           "No file has been selected!",
  50.           "Use \"Open File...\" button to select file.",
  51.           NULL,
  52.       NOTICE_BUTTON_YES,    "Ok",
  53.       NOTICE_NO_BEEPING,    TRUE,
  54.       XV_SHOW,        TRUE,
  55.       NULL);
  56.       
  57.   xv_destroy_safe(notice);
  58. }
  59.  
  60.  
  61. void play_anim(void)
  62. {
  63.   char command[PATH_MAX+NAME_MAX+50];
  64.   char dithering[30];
  65.   int  i,quiet=0;
  66.   
  67.   int dec=(int)xv_get(options,PANEL_VALUE);
  68.   int dith=(int)xv_get(dither,PANEL_VALUE);
  69.  
  70.   /* Show a warning if no file has been selected -- nothing to play */
  71.   if (f_name[0]=='\0') {
  72.       show_warning();
  73.       return;
  74.   }
  75.  
  76.   /* Determine which options have been chosen */
  77.   strcpy(command,"mpeg_play ");
  78.   for(i=0;dec;i++,dec>>=1)
  79.     if (dec & 1) 
  80.       switch(i) {
  81.         case 0: strcat(command," -nob"); break;
  82.         case 1: strcat(command," -nop"); break;
  83.         case 2: strcat(command," -quiet"); 
  84.             quiet=1;
  85.             break;
  86.       }
  87.   
  88.   /* Determine which type of dithering has been chosen */
  89.   switch(dith){
  90.       case 0: strcpy(dithering," -dither ordered"); break;
  91.       case 1: strcpy(dithering," -dither ordered2"); break;
  92.       case 2: strcpy(dithering," -dither mbordered"); break;
  93.       case 3: strcpy(dithering," -dither fs4"); break;
  94.       case 4: strcpy(dithering," -dither fs2"); break;
  95.       case 5: strcpy(dithering," -dither fs2fast"); break;
  96.       case 6: strcpy(dithering," -dither hybrid"); break;
  97.       case 7: strcpy(dithering," -dither hybrid2"); break;
  98.       case 8: strcpy(dithering," -dither 2x2"); break;
  99.       case 9: strcpy(dithering," -dither gray"); break;
  100.       case 10:strcpy(dithering," -dither color"); break;
  101.       case 11:strcpy(dithering," -dither none"); break;
  102.       case 12:strcpy(dithering," -dither mono"); break;
  103.       case 13:strcpy(dithering," -dither threshold"); break;
  104.       default: break;
  105.   }
  106.   if (dith!=14) strcat(command,dithering);
  107.  
  108.   strcat(command," ");
  109.   strcat(command,f_name);
  110.   if(quiet) 
  111.     strcat(command," >/dev/null");
  112.   else
  113.     strcat(command," >/dev/console");
  114.   strcat(command," 2>/dev/console");
  115.   /* Execute system command! */
  116.   system(command);
  117. }
  118.  
  119.  
  120. void opened_file(File_chooser fc,char *path,char *file,Xv_opaque client_data)
  121. {
  122.   char title[NAME_MAX+10]="xvmpeg: ";
  123.   
  124.   strcat(title,file);
  125.   strcpy(f_name,path);
  126.   xv_set(frame,FRAME_LABEL,title,NULL);
  127.   xv_set(fc, XV_SHOW, FALSE, NULL);    
  128. }
  129.  
  130. void open_file(void)
  131. {
  132.   File_chooser    open_file_win;
  133.   
  134.   open_file_win = xv_create(frame, FILE_CHOOSER_OPEN_DIALOG,
  135.       XV_LABEL,            "Select file to load",
  136.       FILE_CHOOSER_NOTIFY_FUNC,    opened_file,
  137.       NULL);     
  138.   xv_set(open_file_win, XV_SHOW, TRUE, NULL);    
  139. }
  140.  
  141. void setup_icon(Frame frame)
  142. {
  143.   Server_image image_ok, image_mask;
  144.   Icon icon;
  145.  
  146.   image_ok = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  147.       XV_WIDTH,    xvmpeg_width,
  148.       XV_HEIGHT,   xvmpeg_height,
  149.       SERVER_IMAGE_DEPTH,  1,
  150.       SERVER_IMAGE_X_BITS, xvmpeg_bits,
  151.         NULL);
  152.   image_mask = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  153.       XV_WIDTH,    xvmpeg_width,
  154.       XV_HEIGHT,   xvmpeg_height,
  155.       SERVER_IMAGE_DEPTH,  1,
  156.       SERVER_IMAGE_X_BITS, xvmpeg_mask_bits,
  157.       NULL);
  158.   icon = (Icon)xv_create(frame, ICON,
  159.       ICON_IMAGE,       image_ok,
  160.       ICON_MASK_IMAGE,  image_mask,
  161.       ICON_LABEL,       "xvmpeg", 
  162.       NULL);
  163.   xv_set(frame, FRAME_ICON, icon, NULL);
  164. }
  165.  
  166. void about_xvmpeg(void)
  167. {
  168.   Xv_notice notice;
  169.   
  170.   notice = (Xv_notice)xv_create(panel, NOTICE,
  171.       NOTICE_MESSAGE_STRINGS,
  172.           "xvmpeg 0.1, Copyright (C) 1995 Alexandre Naaman",
  173.           "<hoser@step.polymtl.ca>",
  174.           "-------------------------------------------------",
  175.           "xvmpeg comes with ABSOLUTELY NO WARRANTY. This is",
  176.           "free software, you are welcome to redistribute it",
  177.           "under certain conditions; See the GNU General",
  178.           "Public License for details.",
  179.           NULL,
  180.       NOTICE_BUTTON_YES,    "Ok",
  181.       NOTICE_NO_BEEPING,    TRUE,
  182.       XV_SHOW,        TRUE,
  183.       NULL);
  184.  
  185.   xv_destroy_safe(notice);
  186. }
  187.  
  188. void process_args(int argc,char *argv[])
  189. {
  190.   struct stat statbuf;
  191.   char temp[PATH_MAX+NAME_MAX];
  192.   
  193.   if(argc>1) {
  194.     if(stat(argv[1], &statbuf)<0)
  195.       fprintf (stderr,"Unable to stat %s\n",argv[1]);
  196.     else {
  197.       strcpy(f_name,argv[1]);
  198.       sprintf(temp,"xvmpeg: %s", f_name);
  199.       xv_set(frame,FRAME_LABEL,temp,NULL);
  200.     } 
  201.   }
  202. }
  203.  
  204. void resize_window(void)
  205. {
  206.   /* This simply sets the base frame's size back to it's initial size */
  207.   xv_set(frame,XV_HEIGHT,init_height);
  208.   xv_set(frame,XV_WIDTH,init_width);
  209. }
  210.  
  211. int main(int argc,char *argv[])
  212. {
  213.   xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
  214.  
  215.   frame = (Frame)xv_create(XV_NULL, FRAME,
  216.        FRAME_LABEL, XVMPEG_NAME,
  217.        FRAME_SHOW_RESIZE_CORNER, FALSE, 
  218.        NULL);
  219.  
  220.   /* Take care of window resizing events with window managers other
  221.    * than ol(v)wm.
  222.    */       
  223.   xv_set(frame,
  224.       WIN_EVENT_PROC, resize_window,
  225.       NULL); 
  226.  
  227.   process_args(argc,argv);
  228.  
  229.   panel = (Panel)xv_create(frame, PANEL, NULL);
  230.  
  231.   xv_create(panel, PANEL_BUTTON,
  232.       PANEL_NOTIFY_PROC,    open_file,
  233.     PANEL_LABEL_STRING,   "Open file...",
  234.     NULL);
  235.  
  236.   xv_create(panel, PANEL_BUTTON,
  237.     PANEL_NOTIFY_PROC,    play_anim,
  238.     PANEL_LABEL_STRING,   "Play animation",
  239.     NULL);
  240.  
  241.   xv_create(panel, PANEL_BUTTON,
  242.       PANEL_LABEL_STRING,    "About",
  243.       PANEL_NOTIFY_PROC,    about_xvmpeg,
  244.       NULL);
  245.  
  246.   options=xv_create(panel, PANEL_CHECK_BOX,
  247.     PANEL_NEXT_ROW,          -1,
  248.     PANEL_CHOICE_STRINGS, "No B Frames",
  249.                           "No P Frames",
  250.                           "Quiet",
  251.                            NULL,
  252.     PANEL_VALUE,          4, /* Quiet on by default */
  253.     NULL);
  254.  
  255.   dither=xv_create(panel, PANEL_CHOICE_STACK,
  256.     PANEL_LAYOUT,         PANEL_VERTICAL,
  257.     PANEL_NEXT_ROW,          -1,
  258.     PANEL_LABEL_STRING,   "Dithering...",
  259.     PANEL_CHOICE_STRINGS, "Ordered",
  260.                           "Fast Ordered",
  261.                           "Macroblock Ordered",
  262.                           "Floyd-Steinberg with 4 error values",
  263.                           "Floyd-Steinberg with 2 error values",
  264.                           "Fast Floyd-Steinberg with 2 error values",
  265.                           "Hybrid",
  266.                           "Hybrid with error propagation",
  267.                           "2x2",
  268.                           "Grayscale",
  269.                           "Colour 24 bit only",
  270.                           "No diplay, no dither",
  271.                           "Monochrome",
  272.                           "floyd-Steinberg simple, monochrome only",
  273.                           "No dithering",
  274.                           NULL,
  275.     PANEL_VALUE,          14,
  276.     NULL);
  277.  
  278.   setup_icon(frame);
  279.   
  280.   window_fit(panel);
  281.   window_fit(frame);
  282.   
  283.   init_height=(int)xv_get(frame,XV_HEIGHT);
  284.   init_width=(int)xv_get(frame,XV_WIDTH);
  285.   
  286.   xv_main_loop(frame);
  287.   
  288.   return 0;  
  289. }